home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Utilities / Datatypes / AnimDT / classbase.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-09-25  |  32.7 KB  |  882 lines

  1.  
  2. /*
  3. **
  4. **  $VER: classbase.c 1.11 (25.9.97)
  5. **  anim.datatype 1.11
  6. **
  7. **  Library routines for a DataTypes class
  8. **
  9. **  Written 1996/1997 by Roland 'Gizzy' Mainz
  10. **  Original example source from David N. Junod
  11. **
  12. */
  13.  
  14.  
  15. /* main includes */
  16. #include "classbase.h"
  17.  
  18.  
  19. /****** anim.datatype/MAIN ***************************************************
  20. *
  21. *    INTRODUCTION
  22. *        Datatypes class for IFF ANIM animations. Based on the CBM datatypes
  23. *        example source/ documents written by David Junod and the public
  24. *        domain Anim5 code by Jim Kent.
  25. *
  26. *    SHAREWARE
  27. *        Starting with V1.8, anim.datatype is Shareware.
  28. *
  29. *        "anim.datatype" is this version and it's contributed files
  30. *        are Copyright 1995/96/97 by Roland Mainz except otherwise noted.
  31. *        All rights reserved.
  32. *
  33. *        You are allowed to use anim.datatype for 30 days. If you
  34. *        want to use it after this time, please register.
  35. *        The registration fee is 15 DM, 10 US-$ or equivalent.
  36. *        There is no different registered version, this version of
  37. *        anim.datatype is fully functional.
  38. *
  39. *        Payment my be done using bank transfer (prefereed; see AUTHOR
  40. *        section below for my bank account), euro-scheques (on my name)
  41. *        or cash money in an envelope (ON YOUR OWN RISK !).
  42. *
  43. *        New versions are released through the Aminet.
  44. *
  45. *        As a service for registered users I will notify you about
  46. *        new versions if I get your email address.
  47. *        To be able to do this, you should fill in the following form
  48. *        and send this to my email/snail-mail address:
  49. *
  50. *        -- snip --
  51. *
  52. *        Product/Version: anim.datatype 1.10 (4.8.97)_______________________
  53. *
  54. *        Name:     _________________________________________________________
  55. *
  56. *        Street:   _________________________________________________________
  57. *
  58. *        City/ID:  _________________________________________________________
  59. *
  60. *        Country:  _________________________________________________________
  61. *
  62. *        Phone:    _________________________________________________________
  63. *
  64. *        EMail:    _________________________________________________________
  65. *
  66. *        Shareware fee: _ 10 US-$
  67. *                       _ 15 DM
  68. *                       _ other (in a amount which equals to the US-$ fee)
  69. *
  70. *        Payed by  _ cash money in envelope (on your own risk !)
  71. *                  _ euro-scheque (on my name)
  72. *                  _ bank transfer
  73. *
  74. *        Comments: _________________________________________________________
  75. *
  76. *                  _________________________________________________________
  77. *
  78. *                  _________________________________________________________
  79. *
  80. *        -- snip --
  81. *
  82. *    REQUIREMENTS
  83. *        - You need at least Kick/WB 3.0.
  84. *          | Many people wrote me that they cannot find an
  85. *          | "animation.datatype" class.
  86. *          | Only the 3.1 release contains it. (Subclasses of)
  87. *          | animation.datatype can run under 3.0.
  88. *
  89. *        - "datatypes/animation.datatype", >= V39.
  90. *          "animation.datatype 40.7 (28.09.93)" requires itself some
  91. *          libraries/boopsi classes:
  92. *        - "realtime.library", >= V39              - for timing
  93. *        - "gadgets/tapedeck.gadget" (any version) - for the controls
  94. *
  95. *           If you want to attach samples, you need "sound.datatype" >= V39
  96. *           and your prefereed subclass (8svx.datatype for IFF 8SVX samples
  97. *           etc.).
  98. *
  99. *    USAGE
  100. *        If the datatypes descriptor file was activated, any attempt to load
  101. *        an IFF anim stream using GMultiView, MultiView, AmigaGuide or
  102. *        SwitchWindow will load and play the animation. If the source was a
  103. *        file, anim.datatype loads frames dynamically from disk, if the
  104. *        source was the clipboard, anim.datatype caches the whole anim.
  105. *
  106. *        anim.datatype supports also the clipboard as input, e.g.
  107. *        "MultiView CLIPBOARD", ClipView or SwitchWindow are able to show
  108. *        IFF ANIMs from clipboard.
  109. *
  110. *        If you want to save the current animation in anim.datatype's local
  111. *        format, use MultiView's "Project/Save As..." menu (or GMultiView's
  112. *        "Project/Save As Raw...").
  113. *        anim.datatype saves the current animation, stating with the current
  114. *        frame as IFF ANIM-3.
  115. *        Other compression formats such as ANIM-0/1/2/4/5/7/8/J will
  116. *        be implemeted later.
  117. *
  118. *        If you want to attach samples to the animation, you must edit the
  119. *        prefs file (ENV:Classes/DataTypes/anim.prefs) and add the following
  120. *        line:
  121. *        VERBOSE SAMPLE="ram:have_a_nice_day.8svx"
  122. *        Which loads and attaches the sample "ram:have_a_nice_day.8svx" to the
  123. *        animation. See anim.datatype.doc/preferences for a complete
  124. *        description of the prefs file.
  125. *
  126. *    INSTALLATION
  127. *        After unpacking this archive:
  128. *        Because this version does not include an Installer script, you have
  129. *        to do the installation manually through the shell:
  130. *
  131. *          - Unpack this archive and copy the "anim.datatype" to
  132. *            SYS:Classes/DataTypes:
  133. *
  134. *     Copy CLONE FROM "anim.datatype" TO "SYS:Classes/DataTypes/anim.datatype"
  135. *
  136. *          - Then copy the datatypes descriptor into the DEVS:DataTypes
  137. *            directory.
  138. *            If the descriptor already exists, you should not replace it,
  139. *            otherwise you may loose "toolnodes" and other settings stored in
  140. *            the existing descriptor.
  141. *
  142. *     Copy CLONE FROM "ANIM(%|.info)" TO DEVS:Datatypes/
  143. *
  144. *    SOURCE
  145. *        Partial source is included as an example how to write an
  146. *        animation.datatype subclass which deals with things like
  147. *        "delta-compression" techniques.
  148. *
  149. *    AUTHOR
  150. *        If you want to blame me, report any bugs, or wants a new version
  151. *        send your letter to:
  152. *                        Roland Mainz
  153. *                        Hohenstaufenstraße 8
  154. *                        52388 Nörvenich
  155. *                        GERMANY
  156. *
  157. *        Phone: (+49)(0)2426/901568
  158. *        Fax:   (+49)(0)2426/901569
  159. *
  160. *        Bank account: Kto. 4866 02-508
  161. *        At:           Postbank Köln,
  162. *                      BLZ 37010050
  163. *
  164. *        EMAIL is also available (if you want to send me attachments
  165. *        larger than 1MB (up to 5MB, more with my permission):
  166. *
  167. *        GISBURN@w-specht.rhein-ruhr.de
  168. *
  169. *        Up to July 1997 I'm reachable using this email address, too:
  170. *        Reinhold.A.Mainz@KBV.DE
  171. *
  172. *        | Please put your name and address in your mails !
  173. *        | German mailers should add their phone numbers.
  174. *        | See BUGS section above when submitting bug reports.
  175. *
  176. *        Sorry, but I can only look once a week for mails.
  177. *        If you don't hear something from me within three weeks, please
  178. *        send your mail again (but watch about new releases) (problems with
  179. *        this email port are caused by reconfigurations, hackers, network
  180. *        problems etc.).
  181. *
  182. *        The  entire  "anim.datatype"  package  may  be  noncommercially
  183. *        redistributed, provided  that  the package  is always  distributed
  184. *        in it's complete  form (including it's documentation). A small
  185. *        copy fee  for media costs is okay but any kind of commercial
  186. *        distribution is strictly forbidden without my permission !
  187. *        Comments and suggestions how to improve this program are
  188. *        generally appreciated!
  189. *
  190. *        Thanks to David Junod, who wrote the animation.datatype and lots of
  191. *        the datatypes example code, Jim Kent, Eric Graham and other people
  192. *        for their compression formats, Matt Dillon for his DICE, Olaf
  193. *        'Olsen' Barthel for his help, ideas and some text clips from his
  194. *        documentations.
  195. *
  196. ******************************************************************************
  197. *
  198. */
  199.  
  200.  
  201.  
  202. /****** anim.datatype/--datasheed-- ******************************************
  203. *
  204. *   NAME
  205. *       anim.datatype -- data type for IFF ANIM animations
  206. *
  207. *   SUPERCLASS
  208. *       animation.datatype
  209. *
  210. *   DESCRIPTION
  211. *       The anim datatype, a sub-class of the animation.datatype, is used to
  212. *       load and play IFF anim animations.
  213. *       It supports all currently defined IFF anim compressions
  214. *       (0/1/2/3/4/5/6/7/8/J) and any "interleave count".
  215. *       ILBM BODY Interleaved bitmaps can be uncompressed or compressed using
  216. *       cmpByteRun1.
  217. *       Using the prefs-file, any sound can be attached to the animation.
  218. *
  219. *   METHODS
  220. *       OM_NEW -- Create a new animation object from a description file. The
  221. *           source may be a file or a clipboard unit, both given as an
  222. *           IFFHandle, or you may create an empty object (DTST_RAM).
  223. *
  224. *       OM_DISPOSE -- Dispose instance and contents (frames, colormaps, sounds
  225. *           etc.), then pass msg to superclass.
  226. *
  227. *       OM_UPDATE -- Perform an ICM_CHECKLOOP check, and if succesfull, the
  228. *           method will be executed like OM_SET downstairs.
  229. *
  230. *       OM_SET -- Pass msg to superclass and call GM_RENDER if retval from
  231. *           superclass was != 0UL.
  232. *
  233. *       DTM_WRITE -- Save object's contents in local (IFF ANIM-3) or
  234. *           superclass (IFF ILBM) format.
  235. *
  236. *       ADTM_START -- Start playback.
  237. *
  238. *       ADTM_PAUSE -- Pause playback.
  239. *
  240. *       ADTM_STOP -- Stop playback.
  241. *
  242. *       ADTM_LOADFRAME -- Fill in struct adtFrame with requested information
  243. *           from internal FrameNode list like bitmap, colormap and sample. If
  244. *           the bitmap information is not loaded yet, it will be loaded from
  245. *           disk.
  246. *
  247. *       ADTM_UNLOADFRAME -- Free resources obtained by ADTM_UNLOADFRAME.
  248. *
  249. *       All other methods are passed unchanged to superclass.
  250. *
  251. *   ATTRIBUTES
  252. *       Following attributes are set by the object and are READ-ONLY for
  253. *       applications:
  254. *       DTA_ObjName             -- set by anim file (IFF generic NAME chunk)
  255. *       DTA_ObjAuthor           -- set by anim file (IFF generic AUTH chunk)
  256. *       DTA_ObjAnnotation       -- set by anim file (IFF generic ANNO chunk)
  257. *       DTA_ObjCopyright        -- set by anim file (IFF generic (C)  chunk)
  258. *       DTA_ObjVersion          -- set by anim file (IFF generic FVER chunk)
  259. *       DTA_TotalVert           -- set by BitMapHeader (ILBM BMHD chunk)
  260. *       DTA_TotalHoriz          -- set by BitMapHeader (ILBM BMHD chunk)
  261. *       ADTA_Width              -- set by BitMapHeader (ILBM BMHD chunk)
  262. *       ADTA_Height             -- set by BitMapHeader (ILBM BMHD chunk)
  263. *       ADTA_Depth              -- set by BitMapHeader (ILBM BMHD chunk)
  264. *       ADTA_Frames             -- number of frames in animation
  265. *       ADTA_FramesPerSecond    -- FPS rate (possibly set by DPAN chunk)
  266. *       ADTA_KeyFrame           -- Key frame of animation
  267. *
  268. *   BUGS
  269. *       - In large videos, the frames at the end will be played slower than
  270. *         those at the beginning of the file. This is the result of the
  271. *         sequential search internally used (only serious with more than 25000
  272. *         frames (mc6030/50mhz)).
  273. *         May or may not be fixed.
  274. *
  275. *       - Animations with more than 8 planes will crash the system
  276. *         (anim.datatype handels 12 bit animations, but animation.datatype
  277. *         handles only anims with a depth of 8).
  278. *
  279. *       - ANIM-1-Code has been disabled because it draws the blocks to X and H
  280. *         dimensions which are divisible by 8 (can't be fixed: no test files).
  281. *
  282. *       - The ANHD (AnimHeader) ah_Mask-field will be ignored for ANIM-0,
  283. *         2,3,4,5,6,7,8,J. ANIM-1 (acmpXORILBM) respects this.
  284. *
  285. *       - The BMHD (BitMapHeader) bmh_Masking-field will be ignored.
  286. *
  287. *       - ANIM-4 isn' tested yet (no test files).
  288. *
  289. *       - ANIM-4 has been disabled for the reason above.
  290. *
  291. *       - ANIM-J is twice as slow as it should be because ANIM-J operates on
  292. *         interleaved bitmaps, but (currently) anim.datatype uses
  293. *         non-interleaved bitmaps internally. Therefore the current 
  294. *         implementation interleaves the bitmap, then unpacks, then 
  295. *         de-interleaves the bitmap. Not very efficient.
  296. *
  297. *       - If no DPAN chunk occurs in the file, the FPS-Rate (Frames Per
  298. *         Second) is hard-coded to 5. Other FPS-Rates can be set by the
  299. *         prefs-file (per project if you use the MATCHPROJECT option).
  300. *
  301. *       - Loading from disk is slower than it could be because internal
  302. *         buffers are allocated using the MEMF_CLEAR flag (Relict; for
  303. *         debugging).
  304. *
  305. *       - Any flags in the ANHD (AnimHeader) ah_Flags field except ahfLongData
  306. *         (bit 0; used by Anim-7/8) and ahfXOR (bit 1; used for all
  307. *         compression types except ANIM-J (not required, ANIM-J has an
  308. *         internal XOR mode) and anim-0) are ignored. ANIM-4 suffers under
  309. *         these problems (cannot be fixed without example files).
  310. *
  311. *       - ANIM-6 left/right channels are viewed interleaved. Upon request,
  312. *         I can add options to view the left or right channel only.
  313. *
  314. *       - The internal "rollback" machanism used for creating full images from
  315. *         given DLTAs is slow. This is caused by implementation details,
  316. *         not the idea itself.
  317. *
  318. *       - If an animations contains colormaps-per-frame and the given CMAP
  319. *         contains less colors than (1UL << anim_depth), the remaining colors
  320. *         are filled with black. I don't know where to take the remaining
  321. *         colors (from last frame/previous (e.g. interleaved) frame)...
  322. *         Comments __VERY__ welcome.
  323. *
  324. *       - The ANIM-3 encoder has a slight problem in run-length compression;
  325. *         therefore this part has been disabled.
  326. *
  327. *       - The encoder does not support dynamic timing properly. Instead,
  328. *         all frames are saved.
  329. *
  330. *       - The encoded initial ANIM-3 IFF ILBM BODY is uncompressed.
  331. *
  332. *       - The encoder rejects any attempt to work with non-planar or
  333. *         interleaved planar bitmaps.
  334. *
  335. *   TODO
  336. *       - Fixing the bugs above.
  337. *
  338. *       - Internal cache for packed DLTA chunks. This may speed up the
  339. *         internal rollback mechanism used for random frame access.
  340. *
  341. *       - Other compression formats when saving, including the popular
  342. *         ANIM-5.
  343. *
  344. *       - Add a way how to calculate the FPS rate from stream data when a
  345. *         DPAN chunk is missing or contains a 0 FPS.
  346. *
  347. *       - PERIOD options to modify the given sound.
  348. *
  349. *       - Add support for animation.datatype V41 ADTA_TicksPerFrame timing.
  350. *
  351. *       - Write the "--input_format--"-Autodoc section.
  352. *
  353. *   HISTORY
  354. *       V1.1
  355. *         Released to the Waldspecht-BBS for testing.
  356. *
  357. *       V1.2
  358. *         Released to the Waldspecht-BBS for testing.
  359. *
  360. *       V1.3
  361. *         Released to the Waldspecht-BBS for testing.
  362. *
  363. *       V1.4
  364. *         First Aminet release.
  365. *
  366. *         - Partial code cleanup
  367. *
  368. *         - Recompiled with SAS/C 6.57.
  369. *
  370. *         - Redirected serial "verbose" output to a CON:-window, including
  371. *           the matching VERBOSE prefs option.
  372. *
  373. *         - Changed the VERBOSE output a little bit.
  374. *
  375. *       V1.5
  376. *         - Implemented palette per frame (ILBM CMAPs per frame).
  377. *           (animation.datatype 40.7 does not support these colormap changes
  378. *           per frame (it's output may look like a color trash). Custom
  379. *           animation players which uses animation.datatype subclasses for
  380. *           loading (like my DBufDTAnim) don't have this problem.
  381. *           animation.datatype will support these colormaps-per-frame in one
  382. *           of the next updates.)
  383. *
  384. *         - Internal changes to be able to support up to 12 planes in an anim.
  385. *           The animation.datatype 40.7 supports only anims up to 8 planes,
  386. *           otherwise the machine will crash. My animation.datatype V41 will
  387. *           support this.
  388. *
  389. *         - The generic IFF ANNO, AUTH, FVER, NAME and "(C) " chunks are now
  390. *           moved to the corresponsing DataTypes attributes if they appear in
  391. *           a FORM ILBM.
  392. *           The data will be moved like this:
  393. *           ANNO -> DTA_ObjAnnotation
  394. *           AUTH -> DTA_ObjAuthor
  395. *           FVER -> DTA_ObjVersion
  396. *           NAME -> DTA_ObjName
  397. *           (C)  -> DTA_ObjCopyright
  398. *
  399. *         - DTA_Title equals now to DTA_ObjName (e.g. a given NAME chunk). If
  400. *           this is NULL, DTA_Name is used instead.
  401. *
  402. *         - If a DPAN (DPaint Anim) chunk occurs, the FPS rate is taken from
  403. *           the "flags" field.
  404. *           Thanks to Brian Jones (bjones@cadvision.com) for reporting this.
  405. *           If the value taken is 0, the old, fixed rate (5 fps) is used
  406. *           again.
  407. *
  408. *         - Fixed a hole in the state machine which causes problems when an
  409. *           animation contains no frames. Should work now.
  410. *           Fixed.
  411. *
  412. *         - An error in the prefs-file will now force the VERBOSE option.
  413. *
  414. *         - Implemented sound. A sample can now be attached to the animation
  415. *           using the SAMPLE/VERBOSE options.
  416. *           Note that anim.datatype is still a GID_ANIMATION (anim WITHOUT
  417. *           sound) type datatype.
  418. *           The GID_#? idetifiers belongs to the source data, not the
  419. *           modifications done by a datatype code (a IFF ANIM does not contain
  420. *           any sound data, the sound is attached later).
  421. *
  422. *       V1.6
  423. *         - Disabled the optimizer. This fixes a mysterious System-Crash
  424. *           when resizing the parent application window. Don't know why this
  425. *           works now :-((
  426. *
  427. *       V1.7
  428. *         - Reorganisation of source (includes small cleanup).
  429. *
  430. *         - Fixed a silly hole in the state machine which causes the
  431. *           datatype to return errors on colormap changes (e.g. ILBM CMAPs).
  432. *           Error codes were returned like this:
  433. *           (Number_of_colors_in_CMAP * 3).
  434. *
  435. *         - Enabled the optimizer (see V1.6) again. Since reorganisation of
  436. *           the src, the problem never occured again. Any hint ?
  437. *
  438. *         - Fixed a bug in LibExpunge (didn't check lib_OpenCnt), which is
  439. *           also present in all my other external BOOSI classes (and
  440. *           datatypes).
  441. *           Thanks to Guenter Niki (gniki@informatik.uni-rostok.de) for
  442. *           reporting this bug.
  443. *
  444. *       V1.8
  445. *         * Shareware
  446. *           Starting with V1.8, anim.datatype is Shareware.
  447. *
  448. *         - Added experimental stack swapping code. The "Need more stack"-
  449. *           requester has been removed for this reason.
  450. *           This also fixes a possible deadlock of "input.device" because
  451. *           the GM_LAYOUT method was running with low stack.
  452. *
  453. *         - Uses OpenFromLock when obtaining a fh for random frame access.
  454. *           This allows the usage of "virtual filesystems" (datatypes.library
  455. *           V45 allows such things).
  456. *
  457. *         - Now supports saving in the local format (e.g. IFF ANIM,
  458. *           currently only ANIM-3).
  459. *           Note that saveing begins with the __current__ frame and can be
  460. *           controlled with the ADTA_Frame, ADTA_Frames and
  461. *           ADTA_FrameIncrement attributes.
  462. *
  463. *         - Now support DTST_RAM (creates an empty anim.datatype object).
  464. *
  465. *         - Now supports subclasses of anim.datatype, mainly to fill in
  466. *           the ADTM_LOADFRAME/ADTM_UNLOADFRAME methods when using an empty
  467. *           (e.g. created with DTST_RAM) anim.datatype object.
  468. *
  469. *         - Now the high order bits of each color gun are replicated through
  470. *           the whole INT32 in the colormap.
  471. *
  472. *       V1.9
  473. *         - Fixed a bug which prevents saving in local (IFF ANIM-3) format
  474. *           using an (created using DTST_RAM) empty object (like "DTConvert"
  475. *           does).
  476. *           Fixed.
  477. *
  478. *       V1.10
  479. *         - Moved IFF ANIM defines etc. to classdata.h include file.
  480. *
  481. *         - Reworked file scan. This fixes problems with many animations
  482. *           where the second frame was treated as an ILBM instead of an DLTA.
  483. *           Fixed.
  484. *
  485. *         - Implemented ADTM_START, ADTM_STOP and ADTM_PAUSE to get a more
  486. *           smoothly start and stop, see method autodocs for details.
  487. *
  488. *         - Implemented Martin Tailefer's AsyncIO code (currenty broken,
  489. *           has been disabled for now).
  490. *
  491. *         - Removed unnecessary GM_LAYOUT code; DTA_Total(Vert|Horiz) are now
  492. *           set in OM_NEW.
  493. *
  494. *         - Fixed ADTM_LOADFRAME that if a frame can't be loaded (seek error,
  495. *           or timestamp not found) now a matching error code will be
  496. *           returned in Result2.
  497. *
  498. *         - Removed NOREMAP feature and matching DTM_FRAMEBOX code because
  499. *           this was an ugly hack...
  500. *
  501. *         - XORBitMap has been rewritten, XOR mode for
  502. *           ANIM-2/-3/-4/-5/-6/-7-/8 should now be a little bit faster;
  503. *           this also fixes two bugs:
  504. *           - The bitmaps were incorrectly merged together when the bitmap
  505. *             size grows over 64k per plane (for example 1280 * 512)
  506. *             Fixed.
  507. *           - Due rounding errors the last 8 pixels were not processed
  508. *             Fixed.
  509. *
  510. *         - Plane pointers are now on a quad-long boundary to get more speed
  511. *           on a mc68040.
  512. *
  513. *         - Internal CopyBitMap has been optimized to use CopyMemQuick if
  514. *           possible.
  515. *
  516. *         - Added compatibility code for DPaint ANIM Brushes, compressed with
  517. *           ANIM-5 and XOR mode, but which don't have the XOR bit set.
  518. *           Added NODPAINTBRUSHPATCH to disable this function.
  519. *           This fixes the problems with the animations I found in the CanDo
  520. *           distribution.
  521. *
  522. *         - Added support for GRAB chunk (grabbing point of animation).
  523. *           Does only work with animation.datatype V41 (which implements
  524. *           PDTA_Grab attribute).
  525. *
  526. *         - Stack swapping code has been improved; the stack is now only
  527. *           swapped if stacksize falls below 16384 / 2 bytes; this saves
  528. *           the stack allocation for ADTM_LOADFRAME / ADTM_UNLOADFRAME
  529. *           in animation.datatype V41.
  530. *
  531. *         - Added WaitBlit in OM_DISPOSE to wait for blitter which may
  532. *           use our bitmaps.
  533. *
  534. *         - Added seperate memory pool for frame bitmaps, which is
  535. *           set up to have the correct size for this job.
  536. *           This should speed up bitmap memory allocations.
  537. *           The pool's size is reduced if there is not enougth memory.
  538. *           The other "misc usage" pool is increased to 32k get the
  539. *           correct size for DLTA temp mem usage.
  540. *           The datatype now uses AllocVecPooled instead of AllocVec
  541. *           for delta buffers.
  542. *
  543. *         - Cut some chars from the AnimHeader dump output. Now it fits
  544. *           on a single-line in a 640 pixel CON: window (topaz 8 font).
  545. *
  546. *         - Added NOLOADALL and CMAPS switch for multi-line prefs using
  547. *           the MATCHPROJECT option.
  548. *
  549. *         - Added additional checking code for CAMG chunk data. Invalid
  550. *           flags are now removed.
  551. *
  552. *         - Added support for dynamic timing, e.g. anim.datatype now uses
  553. *           AnimHeader's ah_AbsTime and ah_RelTime fields. Does only work
  554. *           properly with animation.datatype V41 (for animation.datatype
  555. *           V40 this option is turned off per default and turned on if
  556. *           superclass is animation.datatype V41); matching NODYNAMICTIMING
  557. *           and DYNAMICTIMING options have been added; modifications
  558. *           have been made in AttachSamples and ADTM_LOADFRAME, too.
  559. *
  560. *         - Fixed the bug that the last sample's length wasn't calculated
  561. *           correctly, which may have caused Enforcer read-hits (never
  562. *           seen, but...).
  563. *
  564. *         - Added SAMPLESPERFRAME option to override own calculations.
  565. *           This allows to get rid of rounding errors in such cases.
  566. *
  567. *         - Added "wanted" message for IFF ANIM-4 animations. If you have
  568. *           such an animation, and if you are the FIRST who send's me a VALID
  569. *           IFF ANIM-4 compressed animation, you'll get $10. No joke.
  570. *
  571. *         - ANIM-3 encoder has been cut down in functionality to get
  572. *           (temporary) rid of a bug in run-length encoding (DPaint IV AGA
  573. *           does not like this !?).
  574. *
  575. *         - The encoder does not not fail if a subclass returns
  576. *           ERROR_OBJECT_NOT_FOUND for ADTM_LOADFRAME. It simply tries
  577. *           to load the next frame. This fixes some problems with dynamic
  578. *           timing.
  579. *
  580. *         - The encoder now checks explicitly for non-planar or interleaved
  581. *           planar input bitmaps, which are NOT supported yet (e.g.
  582. *           such an attempt results in ERROR_NOT_IMPLEMENTED).
  583. *
  584. *         - A fps value greater than 60 fps found in a DPAN chunk is now
  585. *           treated as invalid.
  586. *
  587. *       V1.11
  588. *         - Recompiled with SAS/C 6.58. May fix some mc68060 related 
  589. *           problems.
  590. *
  591. *         - Found the longstanding bug that animation.datatype V40.7
  592. *           didn't free some frames. Reason is that ADTM_LOADFRAME
  593. *           may be used like "realloc". Now alf_UserData is checked;
  594. *           any given frame will be freed (ADTM_UNLOADFRAME).
  595. *           Fixed.
  596. *
  597. *         - ADTM_UNLOADFRAME now clears alf_UserData to indicate that the
  598. *           frame has been freed.
  599. *
  600. *         - Now supports anims deeper than 8 planes, but a colormap
  601. *           (e.g. a CMAP chunk) is still expected.
  602. *
  603. *         - Fixed the bug that a free of the current frame caused an frame
  604. *           to be not freed. (The idea was to hold the current frame for
  605. *           following delta accesses; this has been replaced by the idea
  606. *           of the "posted free").
  607. *
  608. *         - Implemented the idea of a "posted free". For delta accesses,
  609. *           it's not very usefull to free the frame when the next frame
  610. *           needs it for it's delta access. Therefore, the anim.datatype
  611. *           now manages a "free list", where the free of the previous
  612. *           and the previous-previous frame will be posted until
  613. *           it is really not longer in use.
  614. *
  615. *         - Fixed a bug in the LOADALL mode that the wrong previous
  616. *           frame was used (due a change in V1.10).
  617. *
  618. *         - The single framenodes now caches a pointer to their previous
  619. *           frame. This should speed up loading a little bit.
  620. *
  621. *         - If an animation has dynamic timing and the superclass
  622. *           (animation.datatype) has the ADTA_AdaptiveFPS flag set,
  623. *           the playback speed now defaults to 60 fps.
  624. *
  625. *         - Saved an AllocVecPooled in ADTM_LOADFRAME by merging multiple
  626. *           delta buffer allocations to one allocation (which can hold the
  627. *           largest delta).
  628. *
  629. *         - The stack swapping code now allocates it's memory without
  630. *           the MEMF_CLEAR flags, which should speed up things.
  631. *
  632. *         - Removed BestModeIDA code, because animation.datatype does
  633. *           the same.
  634. *
  635. *         - The options setting for DPaint brush compatibility patch
  636. *           worked wrong (the order was wrong). Now the options
  637. *           work as described.
  638. *           Fixed.
  639. *
  640. *         - Fixed a bug in the encoder that the last color of a dynamic 
  641. *           pallete as not copied (GetRGB32 got numcolors - 1 instead
  642. *           of numcolors).
  643. *           Fixed.
  644. *
  645. *   NOTES
  646. *       This datatype first scans the whole animation to get index
  647. *       information (if the LOADALL switch was set in the prefs-file,
  648. *       the entire animation will be loaded), colormaps will be loaded
  649. *       immediately.
  650. *
  651. *   SEE ALSO
  652. *       animation.datatype,
  653. *       mpegsystem.datatype, mpegvideo.datatype,
  654. *       picmovie.datatype,
  655. *       cdxl.datatype. avi.datatype, quicktime.datatype,
  656. *       moviesetter.datatype,
  657. *       film.datatype,
  658. *       directory.datatype,
  659. *       markabletextdtclass
  660. *
  661. *******************************************************************************
  662. *
  663. */
  664.  
  665.  
  666. /****** anim.datatype/--input_format-- ****************************************
  667. *
  668. *    NAME
  669. *        IFF ANIM -- IFF animation format
  670. *
  671. *    DESCRIPTION
  672. *        <Not written yet, sorry>
  673. *
  674. *        acmpILBM             -- ILBM BODY
  675. *        acmpXORILBM          -- XOR
  676. *        acmpLongDelta        -- Long Delta
  677. *        acmpShortDelta       -- Short Delta
  678. *        acmpDelta            -- General Delta
  679. *        acmpByteDelta        -- Byte Vertical
  680. *        acmpStereoByteDelta  -- Stereo Byte Vertical (left/right channel)
  681. *        acmpAnim7            -- Anim7 (nonstandard format)
  682. *        acmpAnim8            -- Anim5 compression using LONG/WORD data
  683. *        acmpAnimJ            -- Eric Grahams compression format
  684. *
  685. *
  686. *    SEE ALSO
  687. *        - "ANIM.DOC" IFF Animspecs,
  688. *          "ANIM.BRUSH.DOC" Anim specs,
  689. *          "ANIM.OP6" Anim specs,
  690. *          "ANIM7.DOC" Anim specs
  691. *          "ANIM.OP8" Anim specs
  692. *
  693. *        - ARKM Devices (Addison Wesley): IFF part
  694. *
  695. *        - iffparse.library autodocs
  696. *
  697. *        - AAP/AAC docs (for a complete description of the Anim7 format)
  698. *
  699. *        - Viewtek (VT) distribution for Anim 7 info
  700. *
  701. *******************************************************************************
  702. *
  703. */
  704.  
  705.  
  706.  
  707. /*****************************************************************************/
  708.  
  709. DISPATCHERFLAGS
  710. struct IClass *ObtainAnimEngine( REGA6 struct ClassBase *cb )
  711. {
  712.     return( (cb -> cb_Lib . cl_Class) );
  713. }
  714.  
  715. /*****************************************************************************/
  716.  
  717. DISPATCHERFLAGS
  718. struct Library *LibInit( REGD0 struct ClassBase *cb, REGA0 BPTR seglist, REGA6 struct ExecBase *sysbase )
  719. {
  720.     cb -> cb_SegList = seglist;
  721.     cb -> cb_SysBase = sysbase;
  722.  
  723.     InitSemaphore( (&(cb -> cb_Lock)) );
  724.  
  725.     if( (cb -> cb_SysBase -> LibNode . lib_Version) >= 39UL )
  726.     {
  727.       /* Obtain ROM libs */
  728.       if( cb -> cb_UtilityBase = OpenLibrary( "utility.library", 39UL ) )
  729.       {
  730.         if( cb -> cb_DOSBase = OpenLibrary( "dos.library", 39UL ) )
  731.         {
  732.           if( cb -> cb_IFFParseBase = OpenLibrary( "iffparse.library", 39UL ) )
  733.           {
  734.             if( cb -> cb_GfxBase = OpenLibrary( "graphics.library",  39UL ) )
  735.             {
  736.               if( cb -> cb_IntuitionBase = OpenLibrary( "intuition.library", 39UL ) )
  737.               {
  738.                 return( (&(cb -> cb_Lib . cl_Lib)) );
  739.  
  740. #ifdef COMMENTED_OUT
  741.                 CloseLibrary( (cb -> cb_IntuitionBase) );
  742. #endif /* COMMENTED_OUT */
  743.               }
  744.  
  745.               CloseLibrary( (cb -> cb_GfxBase) );
  746.             }
  747.  
  748.             CloseLibrary( (cb -> cb_IFFParseBase) );
  749.           }
  750.  
  751.           CloseLibrary( (cb -> cb_DOSBase) );
  752.         }
  753.  
  754.         CloseLibrary( (cb -> cb_UtilityBase) );
  755.       }
  756.     }
  757.  
  758.     return( NULL );
  759. }
  760.  
  761. /*****************************************************************************/
  762.  
  763. DISPATCHERFLAGS
  764. LONG LibOpen( REGA6 struct ClassBase *cb )
  765. {
  766.     LONG retval = (LONG)cb;
  767.     BOOL success = TRUE;
  768.  
  769.     ObtainSemaphore( (&(cb -> cb_Lock)) );
  770.  
  771.     /* Use an internal use counter */
  772.     cb -> cb_Lib . cl_Lib . lib_OpenCnt++;
  773.     cb -> cb_Lib . cl_Lib . lib_Flags &= ~LIBF_DELEXP;
  774.  
  775.     if( (cb -> cb_Lib . cl_Lib . lib_OpenCnt) == 1U )
  776.     {
  777.       if( (cb -> cb_Lib . cl_Class) == NULL )
  778.       {
  779.         success = FALSE;
  780.  
  781.         if( cb -> cb_DataTypesBase = OpenLibrary( "datatypes.library", 39UL ) )
  782.         {
  783.           if( cb -> cb_SuperClassBase = OpenLibrary( "datatypes/animation.datatype", 39UL ) )
  784.           {
  785.             if( cb -> cb_Lib . cl_Class = initClass( cb ) )
  786.             {
  787.               success = TRUE;
  788.             }
  789.           }
  790.         }
  791.       }
  792.     }
  793.  
  794.     if( !success )
  795.     {
  796.       CloseLibrary( (cb -> cb_SuperClassBase) );
  797.       CloseLibrary( (cb -> cb_DataTypesBase) );
  798.  
  799.       cb -> cb_DataTypesBase = cb -> cb_SuperClassBase = NULL;
  800.  
  801.       (cb -> cb_Lib . cl_Lib . lib_OpenCnt)--;
  802.  
  803.       retval = 0L;
  804.     }
  805.  
  806.     ReleaseSemaphore( (&(cb -> cb_Lock)) );
  807.  
  808.     return( retval );
  809. }
  810.  
  811. /*****************************************************************************/
  812.  
  813. DISPATCHERFLAGS
  814. LONG LibClose( REGA6 struct ClassBase *cb )
  815. {
  816.     LONG retval = 0L;
  817.  
  818.     ObtainSemaphore( (&(cb -> cb_Lock)) );
  819.  
  820.     if( cb -> cb_Lib . cl_Lib . lib_OpenCnt )
  821.     {
  822.       (cb -> cb_Lib . cl_Lib . lib_OpenCnt)--;
  823.     }
  824.  
  825.     if( ((cb -> cb_Lib . cl_Lib . lib_OpenCnt) == 0U) && (cb -> cb_Lib . cl_Class) )
  826.     {
  827.       if( FreeClass( (cb -> cb_Lib . cl_Class) ) )
  828.       {
  829.         cb -> cb_Lib . cl_Class = NULL;
  830.  
  831.         CloseLibrary( (cb -> cb_SuperClassBase) );
  832.         CloseLibrary( (cb -> cb_DataTypesBase) );
  833.       }
  834.       else
  835.       {
  836.         cb -> cb_Lib . cl_Lib . lib_Flags |= LIBF_DELEXP;
  837.       }
  838.     }
  839.  
  840.     ReleaseSemaphore( (&(cb -> cb_Lock)) );
  841.  
  842.     if( (cb -> cb_Lib . cl_Lib . lib_Flags) & LIBF_DELEXP )
  843.     {
  844.       retval = LibExpunge( cb );
  845.     }
  846.  
  847.     return( retval );
  848. }
  849.  
  850. /*****************************************************************************/
  851.  
  852. DISPATCHERFLAGS
  853. LONG LibExpunge( REGA6 struct ClassBase *cb )
  854. {
  855.     BPTR seg;
  856.  
  857.     if( cb -> cb_Lib . cl_Lib . lib_OpenCnt )
  858.     {
  859.       cb -> cb_Lib . cl_Lib . lib_Flags |= LIBF_DELEXP;
  860.  
  861.       seg = NULL;
  862.     }
  863.     else
  864.     {
  865.       Remove( (&(cb -> cb_Lib . cl_Lib . lib_Node)) );
  866.  
  867.       seg = cb -> cb_SegList;
  868.  
  869.       CloseLibrary( (cb -> cb_IntuitionBase) );
  870.       CloseLibrary( (cb -> cb_GfxBase) );
  871.       CloseLibrary( (cb -> cb_IFFParseBase) );
  872.       CloseLibrary( (cb -> cb_DOSBase) );
  873.       CloseLibrary( (cb -> cb_UtilityBase) );
  874.  
  875.       FreeMem( (APTR)((ULONG)(cb) - (ULONG)(cb -> cb_Lib . cl_Lib . lib_NegSize)), (ULONG)((cb -> cb_Lib . cl_Lib . lib_NegSize) + (cb -> cb_Lib . cl_Lib . lib_PosSize)) );
  876.     }
  877.  
  878.     return( (LONG)seg );
  879. }
  880.  
  881.  
  882.